/*
 * @Author: zhanyinjia
 * @Date: 2022-07-09 14:49:42
 * @LastEditTime: 2022-07-11 23:47:57
 * @LastEditors: zhanyinjia
 * @Description:
 * @FilePath: \ts\2-function.ts
 */
// 函数的2种声明方式：function关键字、函数表达式
//声明不赋值就是any，如果就是需要参数是any类型，tsconfig.json的noImplicitAny设置false
/* function sum1(a, b) {
    return a + b;
} */

// 1）function关键字声明
function sum2(a: string, b: string): string {
    return a + b;
}
// sum2('a', 2);

// 2）表达式声明   给一个变量定义了函数类型，就可以把一个可以兼容的函数赋值给它
let sum3 = (a: string, b: string): string => {
    return a + b;
}
let sum4: (a1: string, b1: string) => string = (a, b) => {
    return a + b;
}

type Sum = (a1: string, b1: string) => string
let sum5: Sum = (a: string, b: string): string => {
    return a + b;
}

sum5('1', '2')

// 可选参数?  
// b? 表示b可以不传递，不传递就是undefined 
// b:string | undefined 必须要传递，哪怕是undefined也必须要手动传递
let sum6 = (a: string, b?: string): string => {
    return a + b;
};
sum6('a'); // 可选参数必须在其他参数的最后面

// 默认值=
let sum7 = (a: string, b: string = 'b'): string => {
    return a + b;
};
sum7('a'); // 默认参数必须在其他参数的最后面

// 剩余参数
const sum8 = (...args: string[]): string => {
    return args.reduce((memo, current) => memo += current, '')
}
sum8('a', 'b', 'c', 'd')

// 函数重载  
// 希望把一个字符串或一个数字转化成一个数组
// 123 => [1,2,3]
// '123' => ['1','2','3]
function toArray1(value: string | number): string[] | number[] {
    return []
}

function toArray(value: number): number[]
function toArray(value: string): string[]
function toArray(value: number | string) {
    if (typeof value == 'string') {
        return value.split('');
    } else {
        return value.toString().split('').map(item => Number(item));
    }
}
toArray(123); // 根据传入不同类型的数据 返回不同的结果
toArray('123');

export { }